﻿using System;
using System.Collections.Generic;

//4.6.5 组合序列
//迭代器具有高度可组合性。我们可以扩展实例，使之只输出偶数斐波那契数列：

namespace _112_枚举类型的迭代_组合序列
{
    class Test
    {
        static IEnumerable<int> Fibs(int fibCount)
        {
            for (int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++)
            {
                yield return prevFib;
                int newFib = prevFib + curFib;
                prevFib = curFib;
                curFib = newFib;
            }
        }
        static IEnumerable<int> EvenNumbersOnly(IEnumerable<int> sequence)
        {
            foreach (int x in sequence)
            {
                if ((x % 2) == 0)
                    yield return x;
            }
        }
        static void Main(string[] args)
        {
            foreach(int fib in EvenNumbersOnly(Fibs(6)))
                Console.WriteLine(fib);
            //当执行MoveNext()操作时，每一个元素都只有到了最后才会进行计算。
            //迭代器模式的组合性在LINQ中时非常有用的。

            Console.ReadKey();
        }
    }
}
